package com.zd01.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
@Aspect
@Slf4j
public class ALLAop {
//    @Pointcut("execution(* com.zd01.servers.*.*(..))")
//    public void pt() {};

    // 在目标方法之前，运行
    // 切入点表达式 execution
//    @Before("execution(* com.zd01.servers.StudentServer.deletes(..)) ||" +
//            " execution(* com.zd01.servers.StudentServer.getBookStudent(..))")
//    public void before() {
//        log.info("before..222222.");
//    }
    // 切入点表达式 annotation
    // 连接点对象
//    @Before("@annotation(com.zd01.anno.LogOperation)")
    public void before(JoinPoint joinPoint) {
        joinPoint.getSignature();
        Object target = joinPoint.getTarget();
        log.info("目标对象: {}",target);
        String name = joinPoint.getTarget().getClass().getName();
        log.info("目标类: {}",name);
        String name2 = joinPoint.getSignature().getName();
        log.info("目标方法名: {}",name2);
        Object[] args = joinPoint.getArgs();
        log.info("方法参数: {}", Arrays.toString(args));
    }
    // 环绕通知
//    @Around("pt()")
//    public Object around(ProceedingJoinPoint pjp) throws Throwable{
//        log.info("Around before...");
//        Object result = pjp.proceed();
//        log.info("Around after...");
//        return result;
//    }
//    // 在目标方法之后，运行，无论是否出现异常，都会执行
//    @After("pt()")
//    public void after() {
//        log.info("after...");
//    }
//    // 在目标方法之后，运行，有返回值，遇到错误，不执行
//    @AfterReturning("pt()")
//    public void afterReturn() {
//        log.info("AfterReturning...");
//    }
//    // 在目标方法之后，只有遇到错误，才会执行
//    @AfterThrowing("pt()")
//    public void afterThrow() {
//        log.info("AfterThrowing...");
//    }
}
